package singletonMode;

/**
 * @author： pang-yun
 * @date： 2021-10-21 09:49
 * 功能目的 ：用于 双重检查  懒加载  线程安全
 * - double-check 概念是 多线程开发中经常使用到的， 如代码所示，我们进行两次 if(singleton==null) 检查， 这样就可以保证线程安全了
 * -                这样实例化代码只用执行一次 后面再次访问时， 判断  if(singleton==null) 直接return实例化对象
 *
 * - 延迟加载 效率高
 * - 实际开发中 推荐使用
 */

public class SingleF {
}

class SingletonF {
    private SingletonF() {
    }

    // volatile 可以作为轻量级锁  instance 一有变化 就会 更新到 主存中
    private static volatile SingletonF instance;

    public static SingletonF getInstance() {
        // 第一次创建实例时 会有多个线程进来 通过 synchronized 限制 第一个进去的 进行实例化  随后进去的 进行判断后跳出
        if (instance == null) {
            synchronized (SingletonF.class) {
                if (instance == null) {
                    instance = new SingletonF();
                }
            }
        }
        return instance;
    }
}
